import acroMLClassMethod from './acroML.ClassMethod.mjs';
import {AcroMLEvents} from '../acroML.Events.mjs';
/**
 * 用insts来维护vue组件实例列表。
 * 因为当多语言切换时，从$root不知道如何遍历到DxDropDownBox模版中的DxDataGrid
 */

class AcroMLTranslator extends AcroMLEvents{
  insts=[];
  init(app,t){
    let translator=this;
    app.mixin({
      created(){
        this.isTranslating=false;
      },
      //beforeMount(){
      mounted(){
        /**
         * app.mixin混入到任何组件的生命周期中。只翻译当前组件。
         * 注意：这里的this是被混入的vue组件实例，不是YJVueTranslator实例
         */
        //let inst=Vue.getCurrentInstance();
        //console.log('DOM mounted:',this.$options.name,this);
        let instWrap=this;
        setTimeout(function(){
          /**
           * 混入的函数是先于组件的函数执行。
           * 用setTimeout造成异步效果，等待让DxDataGrid实例的$_instance有值。 
           * 如果不用setTimeout，混入到mounted函数中，那时DxDataGrid实例的$_instance也不会有值。
           */
          if (translator.translateOne(t,instWrap)){
            translator.insts.push(instWrap);
          }
        }, 0);
      },
      unmounted(){
        let index=translator.insts.indexOf(this);
        if (index>=0) translator.insts.splice(index,1);
      },
      //beforeUpdate(){
      updated(){
        /**
         * 翻译可能导致组件再更新，进入死循环。
         * update可能有很多原因，大多与显示翻译无关。
         * 组件更新时，可能把父组件文本属性给子组件，必须再次翻译。
         */
        let instWrap=this;
        //console.log('updated',instWrap);
        translator.translateOne(t,instWrap);
      }
    });
  }
  translateAll(t){
    let translator=this;
    let ops={isTranslate:true};
    translator.emit('beforeTranslateAll',translator.insts,ops);
    if (!ops.isTranslate) return false;
    for(let i=0;i<translator.insts.length;i++){
      let inst=translator.insts[i];
      translator.translateOne(t,inst);
    }
    translator.emit('afterTranslateAll',translator.insts); 
  }
  translateOne(t,instWrap){
    let translator=this;
    if (instWrap.isTranslating) return true;
    //console.log('translateOne',instWrap);
    instWrap.isTranslating=true;
    try{
      let ops={isTranslate:true};
      translator.emit('beforeTranslateOne',instWrap,ops);
      if (!ops.isTranslate) return false;
      acroMLClassMethod.translateCom(t,instWrap,false);
      //acroMLClassMethod.translateVNode(t,inst.vnode,false);
      translator.emit('afterTranslateOne',instWrap);
    }
    finally{
      /**
       * 用setTimeout造成异步效果，让“因为翻译引起的组件更新”不再进入翻译
       */
      setTimeout(function(){
        instWrap.isTranslating=false;
      },0);
    }
    return true;
  }
}

let acroMLTranslator=new AcroMLTranslator();

export default acroMLTranslator;
export {acroMLTranslator};